[设计模式]之十五:建造者模式


定义

讲一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示

建造者模式主要用于创建一些复杂的对象,这些对象内部构建的建造顺序一般是稳定的,但对象内部的构建通常面对复杂的变化。

UML

示例代码

//产品
public class Product {
    List parts = new List();

    public void add(String part) {
        parts.add(part);
    }

    public void show() {
        for (int i = 0; i < parts.getItemCount(); i++) {
            System.out.println(parts.getItem(i));
        }
    }
}

//builder接口
interface Builder {
    public void buildPartA();
    public void buildPartB();
    public Product getResult();
}

//实现builder接口的不同建造者,也就是不同产品线生产不同的东西。实现接口是为了统一生产流程
public class ConcreteBuilder1 implements Builder {

    private Product product = new Product();

    @Override
    public void buildPartA() {
        // TODO Auto-generated method stub
        product.add("PartA");
    }

    @Override
    public void buildPartB() {
        // TODO Auto-generated method stub
        product.add("PartB");
    }

    @Override
    public Product getResult() {
        // TODO Auto-generated method stub
        return product;
    }

}

public class ConcreteBuilder2 implements Builder {

    private Product product = new Product(); 

    @Override
    public void buildPartA() {
        // TODO Auto-generated method stub
        product.add("PartX");
    }

    @Override
    public void buildPartB() {
        // TODO Auto-generated method stub
        product.add("PartY");
    }

    @Override
    public Product getResult() {
        // TODO Auto-generated method stub
        return product;
    }

}
//管理生产顺序
public class Director {
    public void construct(Builder builder) {
        builder.buildPartA();
        builder.buildPartB();
    }
}


public static void main(String[] args) {
    // TODO Auto-generated method stub
    Director director = new Director();
    Builder b1 = new ConcreteBuilder1();
    Builder b2 = new ConcreteBuilder2();

    director.construct(b1);
    Product p1 = b1.getResult();
    p1.show();
}

Builder接口决定了所有建造必须实现的方法,避免漏掉某些建造步骤。

ConcreteBuilder是具体建造者,不同建造者用不同的方式实现每一个建造步骤。

Director是指挥者,指挥建造的顺序。该类的作用主要有两个:一方面它隔离了客户与生产过程;另一方面它负责控制产品的生成过程。指挥者针对抽象建造者编程,客户端只需要知道具体建造者的类型,即可通过指挥者类调用建造者的相关方法,返回一个完整的产品对象。

评价

建造者模式主要用于创建一些复杂对象,这些对象内部构建间的建造通常是稳定的,但是对象内部构建通常面临复杂的变化。

优点

  • 在建造者模式中, 客户端不必知道产品内部组成的细节,将产品本身与产品的创建过程解耦,使得相同的创建过程可以创建不同的产品对象。
  • 每一个具体建造者都相对独立,而与其他的具体建造者无关,因此可以很方便地替换具体建造者或增加新的具体建造者, 用户使用不同的具体建造者即可得到不同的产品对象
  • 可以更加精细地控制产品的创建过程 。将复杂产品的创建步骤分解在不同的方法中,使得创建过程更加清晰,也更方便使用程序来控制创建过程。
  • 增加新的具体建造者无须修改原有类库的代码,指挥者类针对抽象建造者类编程,系统扩展方便,符合“开闭原则”。

缺点

  • 建造者模式所创建的产品一般具有较多的共同点,其组成部分相似,如果产品之间的差异性很大,则不适合使用建造者模式,因此其使用范围受到一定的限制。
  • 如果产品的内部变化复杂,可能会导致需要定义很多具体建造者类来实现这种变化,导致系统变得很庞大。

文章作者: Wossoneri
版权声明: 本博客所有文章除特別声明外,均采用 CC BY-NC 4.0 许可协议。转载请注明来源 Wossoneri !
评论
  目录